import sys
import os
sys.path.append(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
from logger import get_module_logger
logger = get_module_logger('main')

from flask import Blueprint,render_template,request,session,jsonify
from bt import Bt_api
from decorator import login_required
from flask import current_app

blueprint = Blueprint('main',__name__)

# 获取php版本
@blueprint.route("/main/GetPHPVersion", methods=['GET', 'POST'], endpoint='GetPHPVersion')
@login_required
def GetPHPVersion():
    if request.method == 'POST':
        # 生成缓存键
        cache_key = f"php_version_{session.get('bt_url')}"
        
        # 获取缓存对象
        cache = current_app.extensions['cache']
        
        # 添加调试信息
        logger.debug(f"Cache object type: {type(cache)}")
        logger.debug(f"Cache object: {cache}")
        
        # 尝试从缓存中获取数据
        cached_data = cache.get(cache_key)
        if cached_data:
            return jsonify(cached_data)
        
        # 实例化宝塔API对象
        bt_api=Bt_api(session.get('bt_url'),session.get('bt_key'))
            
        data = bt_api.GetPHPVersion()
        result = data
        # 将结果存入缓存，缓存5分钟
        if hasattr(cache, 'set'):
            cache.set(cache_key, result, timeout=300)
        else:
            logger.warning("Cache object does not have 'set' method")
    
        return jsonify(result)
    
# 切换php版本
@blueprint.route("/main/SetPHPVersion", methods=['GET', 'POST'], endpoint='SetPHPVersion')
@login_required
def SetPHPVersion():
    if request.method == 'POST':
        # 获取缓存对象
        cache = current_app.extensions['cache']
        
        # 添加调试信息
        logger.debug(f"Cache object type: {type(cache)}")
        logger.debug(f"Cache object: {cache}")
        
        # 清除相关缓存
        site_cache_key = f"site_php_version_{session.get('bt_url')}_{session.get('bt_web')}"
        versions_cache_key = f"php_version_{session.get('bt_url')}"
        if hasattr(cache, 'delete'):
            cache.delete(site_cache_key)
            cache.delete(versions_cache_key)
        else:
            logger.warning("Cache object does not have 'delete' method")
        
        # 实例化宝塔API对象
        bt_api=Bt_api(session.get('bt_url'),session.get('bt_key'))
            
        data = bt_api.SetPHPVersion(session.get('bt_web'),request.form.get('phpversion'))
    
        return jsonify(data)
    

# 计算目录大小
@blueprint.route("/main/get_path_size", methods=['GET', 'POST'], endpoint='get_path_size_main')
@login_required
def get_path_size():
    # 获取缓存对象
    cache = current_app.extensions['cache']
    
    # 添加调试信息
    logger.debug(f"Cache object type: {type(cache)}")
    logger.debug(f"Cache object: {cache}")
    
    # 生成缓存键
    cache_key = f"path_size_{session.get('bt_url')}_{session.get('bt_fife')}"
    
    # 尝试从缓存中获取数据
    cached_data = cache.get(cache_key)
    if cached_data:
        return jsonify(cached_data)
   
    # 实例化宝塔API对象
    bt_api=Bt_api(session.get('bt_url'),session.get('bt_key'))
        
    data = bt_api.get_path_size(session.get('bt_fife'))
    
    result = data
    # 将结果存入缓存，缓存1分钟
    if hasattr(cache, 'set'):
        cache.set(cache_key, result, timeout=60)
    else:
        logger.warning("Cache object does not have 'set' method")

    return jsonify(result)


# 计算数据库大小
@blueprint.route("/main/GetInfo", methods=['GET', 'POST'], endpoint='GetInfo_main')
@login_required
def GetInfo():
    # 获取缓存对象
    cache = current_app.extensions['cache']
    
    # 添加调试信息
    logger.debug(f"Cache object type: {type(cache)}")
    logger.debug(f"Cache object: {cache}")
    
    # 生成缓存键
    cache_key = f"db_info_{session.get('bt_url')}_{session.get('bt_web')}"
    
    # 尝试从缓存中获取数据
    cached_data = cache.get(cache_key)
    if cached_data:
        return jsonify(cached_data)
   
    # 实例化宝塔API对象
    bt_api=Bt_api(session.get('bt_url'),session.get('bt_key'))
        
    data = bt_api.GetInfo(session.get('bt_web'))
    
    result = data
    # 将结果存入缓存，缓存5分钟
    if hasattr(cache, 'set'):
        cache.set(cache_key, result, timeout=300)
    else:
        logger.warning("Cache object does not have 'set' method")

    return jsonify(result)

# 获取系统信息
@blueprint.route("/main/system_info", methods=['GET', 'POST'], endpoint='system_info')
def system_info():  # 移除login_required装饰器，手动检查会话
    if 'username' not in session:
        # 如果会话过期，返回错误信息而不是HTML页面
        return jsonify({'error': '会话过期，请重新登录'}), 401
    
    if request.method == 'POST':
        # 实例化宝塔API对象
        bt_api = Bt_api(session.get('bt_url'), session.get('bt_key'))
        
        # 获取系统信息
        data = bt_api.get_system_info()
        
        # 添加调试信息
        logger.debug(f"系统信息数据: {data}")
        
        # 确保返回JSON格式
        return jsonify(data)
    else:
        return jsonify({'error': '只支持POST请求'}), 405

# 获取软件状态
@blueprint.route("/main/get_soft_find", methods=['GET', 'POST'], endpoint='get_soft_find')
@login_required
def get_soft_find():
    if request.method == 'POST':
        # 获取软件名称
        s_name = request.form.get('sName')
        
        # 实例化宝塔API对象
        bt_api = Bt_api(session.get('bt_url'), session.get('bt_key'))
        
        # 获取软件状态
        data = bt_api.get_soft_find(s_name)
        
        return jsonify(data)

# 获取网站PHP版本
@blueprint.route("/main/GetSitePHPVersion", methods=['GET', 'POST'], endpoint='GetSitePHPVersion')
@login_required
def GetSitePHPVersion():
    if request.method == 'POST':
        # 获取缓存对象
        cache = current_app.extensions['cache']
        
        # 添加调试信息
        logger.debug(f"Cache object type: {type(cache)}")
        logger.debug(f"Cache object: {cache}")
        
        # 生成缓存键
        cache_key = f"site_php_version_{session.get('bt_url')}_{session.get('bt_web')}"
        
        # 尝试从缓存中获取数据
        cached_data = cache.get(cache_key)
        if cached_data:
            return jsonify(cached_data)
        
        # 实例化宝塔API对象
        bt_api = Bt_api(session.get('bt_url'), session.get('bt_key'))
        
        # 获取网站PHP版本
        data = bt_api.GetSitePHPVersion(session.get('bt_web'))
        
        result = data
        # 将结果存入缓存，缓存5分钟
        if hasattr(cache, 'set'):
            cache.set(cache_key, result, timeout=300)
        else:
            logger.warning("Cache object does not have 'set' method")
        
        return jsonify(result)

# 获取网络信息
@blueprint.route("/main/GetNetWork", methods=['GET', 'POST'], endpoint='GetNetWork')
@login_required
def GetNetWork():
    if request.method == 'POST':
        # 实例化宝塔API对象
        bt_api = Bt_api(session.get('bt_url'), session.get('bt_key'))
        
        # 获取网络信息
        data = bt_api.GetNetWork()
        
        # 为了提高实时性，我们设置较短的缓存时间或不使用缓存
        # 根据用户偏好，主机负载数据应该实时更新
        result = data
        
        return jsonify(result)

# 主页路由
@blueprint.route("/main/", methods=['GET', 'POST'], endpoint='main_page')
@login_required
def main_page():
    # 从session中获取数据，而不是从API获取
    cdn = current_app.config['CDN']
    return render_template('main.html', 
                          cdn=cdn,
                          host_name=session.get('bt_web', ''),
                          user_name=session.get('bt_web', ''),
                          sql_name=session.get('bt_web', ''),
                          sql_user=session.get('bt_web', ''),
                          sql_pwd=session.get('sql_pwd', ''),
                          web_size=session.get('web_size', '0'),
                          sql_size=session.get('sql_size', '0'),
                          traffic_size=session.get('traffic_size', '1024'))  # 默认流量限制1GB
